﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.IO;

namespace DocTes.Jerarquias
{
    /// <summary>
    /// Interfaz del administrador de fuentes de datos
    /// </summary>
    public interface IAdministrador
    {

        /// <summary>
        /// Cambia un posible estado del documento
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        /// <param name="seleccionado">Dice si esta o no seleccionado como posible estado</param>
        void CambiarPosibleEstadoDocumento(string idProyecto, string idDocumento, string idEstadoAprobado, string idEstadoRechazado, bool seleccionado);

        /// <summary>
        /// Se crea un reporte de documentos con el ID del proyecto
        /// </summary>
        /// <param name="reporte">Stream donde se va a generar el reporte</param>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="costos">Indica si el proyecto es de costos o no</param>
        // /// <returns>Retorna stream del reporte</returns>
        void CrearReporteDocumentosByProyecto(MemoryStream reporte, Guid idProyecto, bool costos);

        /// <summary>
        /// Indica si el boton de aprobar un estado puede visualizarse o no dependiendo el rol del usuario
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoSeleccionado">Identificador del estado seleccionado</param>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="roles">Listado de los roles que tiene el usuario</param>
        /// <returns>Retorna si se puede o no visualizar el boton</returns>
        bool VisibilidadEstadoAprobacion(Guid idProyecto, Guid idEstadoSeleccionado, Guid idDocumento, ReadOnlyCollection<string> roles);

        /// <summary>
        /// Indica si el boton de rechazar un estado puede visualizarse o no dependiendo el rol del usuario
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoSeleccionado">Identificador del estado seleccionado</param>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="roles">Listado de los roles que tiene el usuario</param>
        /// <returns>Retorna si se puede o no visualizar el boton</returns>
        bool VisibilidadEstadoRechazo(Guid idProyecto, Guid idEstadoSeleccionado, Guid idDocumento, ReadOnlyCollection<string> roles);

        /// <summary>
        /// Obtiene las carpetas hijas de una carpeta base
        /// </summary>
        /// <param name="nombreCarpetaBase">Nombre de la carpeta base</param>
        /// <returns></returns>
        List<InfoJerarquia> GetDataSourceCarpetasHijas(string nombreCarpetaBase);

		 /// <summary>
		 /// Obtiene las carpetas hijas de una carpeta base. Sobrecarga que ademas filtra dependiendo
		 /// de los roles de visibilidad de carpeta que se ingresen
		 /// </summary>
		 /// <param name="nombreCarpetaBase">nombre de la carpeta base</param>
		  /// <param name="idRolesCarpetas">roles de carpetas a filtrar</param>
		 /// <returns></returns>
		  List<InfoJerarquia> GetDataSourceCarpetasHijas(string nombreCarpetaBase, List<Guid> idRolesCarpetas);

        /// <summary>
        /// Obtiene las carpetas hijas de una carpeta base
        /// </summary>
        /// <param name="idCarpetaBase">id de la carpeta base</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqJerarquiaCarpeta> GetDataSourceReadOnlyCollectionCarpetasHijas(Guid idCarpetaBase);

        /// <summary>
        /// Obtiene las carpetas hijas de una carpeta base
        /// </summary>
        /// <param name="nombreCarpetaBase">Nombre de la carpeta base</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqJerarquiaCarpeta> GetDataSourceReadOnlyCollectionCarpetasHijas(string nombreCarpetaBase);

        /// <summary>
        /// Obtiene una lista con la informacion de los estados del proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <returns></returns>
        List<InfoEstadosProyecto> GetDataSourceEstadosProyecto(string idProyecto);

        /// <summary>
        /// Obtiene una lista con la informacion de los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identicicador del proyecto</param>
        /// <returns></returns>
        List<InfoEstadosDocumentosProyecto> GetDataSourceEstadosDocumentosProyecto(string idProyecto);

        /// <summary>
        /// Obtiene una lista con la informacion de los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identicicador del proyecto</param>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <returns></returns>
        List<InfoEstadosDocumentosProyecto> GetDataSourceEstadosDocumentosProyecto(string idProyecto, string idDocumento);

        /// <summary>
        /// Indica si el boton de bajar el orden del estado se puede ver
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstado">id del estado</param>
        /// <returns></returns>
        bool VisivilidadBotonDownEstado(string idProyecto, string idEstado);

        /// <summary>
        /// Indica si el boton de bajar el orden del estado del documento se puede ver
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstadoAprobado">id del estado de aprobacion</param>
        /// <returns></returns>
        bool VisivilidadBotonDownEstadoDocumento(string idProyecto, string idEstadoAprobado);

        /// <summary>
        /// Sube el orden del estado del proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstado">Identificador del estado</param>
        void SubirOrdenEstadoProyecto(string idProyecto, string idEstado);

        /// <summary>
        /// Baja el orden del estado del proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstado">Identificador del estado</param>
        void BajarOrdenEstadoProyecto(string idProyecto, string idEstado);

        /// <summary>
        /// Retorna el id de un estado seleccionado de un proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <returns>Retorna el id del estado seleccionado como string en caso de no haber estado seleccionado retorna "- - -"</returns>
        string GetEstadoSeleccionadoProyecto(Guid idProyecto);


        /// <summary>
        /// Elimina un estado asociado a un proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstado">id del estado</param>
        void BorrarEstadoProyecto(string idProyecto, string idEstado);

        /// <summary>
        /// Elimina un estado de un documento
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado">Identificador del Estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void BorrarEstadoDocumentosProyecto(string idProyecto, string idEstadoAprobado, string idEstadoRechazado);

        /// <summary>
        /// Inserta el documento reporte
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="nombreArchivo">nombre del archivo</param>
        /// <param name="archivo">archivo</param>
        /// <param name="nombreCarpetaBase">nombre de la carpeta base</param>
        void InsertarDocumentoReporte(Guid idProyecto, string nombreArchivo, System.Data.Linq.Binary archivo, string nombreCarpetaBase);

        /// <summary>
        /// Borra un documento con un tag específico en una carpeta especifica. Si la 
        /// carpeta llegara a tener más de un documento con el mismo tag se borrarán todos
        /// </summary>
        /// <param name="idProyecto">id del Proyecto</param>
        /// <param name="idJerarquiaCarpeta">id de la carpeta</param>
        /// <param name="idDocumentoTag">id del tag del documento a borrar</param>
        void BorrarDocumentos(Guid idProyecto, Guid idJerarquiaCarpeta, int idDocumentoTag);

        /// <summary>
        /// Borra un documento
        /// </summary>
        /// <param name="guidDocumento">id del documento a borrar</param>
        void BorrarDocumento(Guid guidDocumento);


        /// <summary>
        /// Retorna el Id de la carpeta otros si exise en una jerarquia de carpetas dada
        /// </summary>
        /// <param name="idCarpeta">Id de la carpeta en donde se va a buscar la carpeta otros</param>
        /// <returns>Id de la carpeta otros si existe</returns>
        Guid GetIdCarpetaOtros(Guid idCarpeta);

        /// <summary>
        /// Retorna el Id del candidato por un id de estacion
        /// </summary>
        /// <param name="idEstacion">Id de la estación</param>
        /// <returns>Id del candidato</returns>
        string GetIdCandidatoByIdEstacion(string idEstacion);

        /// <summary>
        /// Obtiene el Id de una carpeta hija por el nombre de la carpeta
        /// </summary>
        /// <param name="idCarpeta">id de la carpeta en donde se va a buscar</param>
        /// <param name="nombreCarpeta">nombre de la carpeta que se va a buscar</param>
        /// <returns>Id de la carpeta hija</returns>
        Guid GetIdCarpetaHijaByName(Guid idCarpeta, string nombreCarpeta);

        /// <summary>
        /// Obtiene el Id de una carpeta con el nombre de la carpeta. Si existe varias carpetas
        /// con el mismo nombre retornara el primer id que encuentre.
        /// </summary>
        /// <param name="nombreCarpeta">nombre de la carpeta que se va a buscar</param>
        /// <returns>Id de la carpeta</returns>
        Guid GetIdCarpetaByName(string nombreCarpeta);

        /// <summary>
        /// Retorna un DataSource de Sitios desde la base de datos
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto al que pertenece el sitio</param>
        /// <returns>DataSource Sitios</returns>
        ListItemCollection GetDataSourceSitios(string idProyecto);

        /// <summary>
        /// Retorna un DataSource de Candidatos para el Sitio indicado
        /// </summary>
        /// <param name="idSitio">Identificador del Sitio</param>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <returns>DataSource Candidatos</returns>
        ListItemCollection GetDataSourceCandidatos(string idSitio, string idProyecto);

        /// <summary>
        /// Retorna un DataSource de clientes
        /// </summary>
        /// <param name="idCliente">Identificador del cliente</param>
        /// <returns>DataSource de Clientes</returns>
        ILinqDataSource GetDataSourceClientes(string idCliente);

        /// <summary>
        /// Retorna un DataSource de Carpetas para el Candidato indicado
        /// </summary>
        /// <param name="idCandidato">Identificador Candidato</param>
        /// <param name="fabricaDataSourceTreeView">Fabrica de dataSOurce para el TreeView</param>
        /// <returns>DataSource Carpetas</returns>
        IJerarquiaCarpetaDataSource GetDataSourceTreeView(Guid idCandidato, IFabricaJerarquiaCarpetaDataSource fabricaDataSourceTreeView);

        /// <summary>
        /// Retorna un DataSource de Documentos para la Carpeta indicada
        /// </summary>
        /// <param name="idCarpeta">Identificador de la Carpeta</param>
        /// <returns>DataSource Documentos</returns>
        ILinqDataSource GetDataSourceDocumentos(Guid idCarpeta);

        /// <summary>
        /// Obtiene una lista de candidatos por el nombre de un sitio
        /// </summary>
        /// <param name="nombreSitio">nombre o parte del nombre del sitio</param>
        /// <returns>Retorna un linq data source con los candidatos</returns>
        ILinqDataSource GetDataSourceCandidatosByNombreSitio(string nombreSitio);


        /// <summary>
        /// Metodo para cambiar la columna relevante en los documentos que esten en la carpeta indicada
        /// con el tag indicado
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idJerarquiaCarpeta">id de la carpeta que contiene el archivo</param>
        /// <param name="idDocumentoTag">id del tipo de documento a cambiar</param>
        void SwitchRelevancia(Guid idProyecto, Guid idJerarquiaCarpeta, int idDocumentoTag);

        /// <summary>
        /// Retorna un DataSource de los documentos permitidos para la carpeta indicada
        /// </summary>
        /// <param name="idCarpeta">Id de la carpeta a buscar</param>
        /// <returns>DataSource para un Repeater</returns>
        Object GetDataSourceDocumentosRoles(Guid idCarpeta);

        /// <summary>
        /// Busca un documento por un id especifico
        /// </summary>
        /// <param name="idDocumento">ID del documento a buscar</param>
        /// <returns>Retorna el documento  o null si no existe un documento con ese id</returns>
        IEntidadLinqDocumento GetDocumentoById(Guid idDocumento);


        /// <summary>
        /// Busca un documento por un id especifico de proyecto
        /// </summary>
        /// <param name="idProyecto">ID del proyecto a buscar</param>
        /// <returns>Retorna el documento  o null si no existe un documento con ese id</returns>
        ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentoByIdProyecto(Guid idProyecto);

        /// <summary>
        /// Carga un documento en el servidor
        /// </summary>
        /// <param name="nombreArchivo">Nombre del Documento</param>
        /// <param name="archivo">Arreglo de Bytes con la información del Documento</param>
        /// <param name="comentario">Comentarios del documento</param>
        /// <param name="idJerarquiaCarpeta">Identificador JerarquiaCarpeta</param>
        /// <param name="fabricaDocumento">Fabrica de EntidadesDocumento</param>
        void UploadDocumento(string nombreArchivo,
                             System.Data.Linq.Binary archivo,
                             string comentario,
                             Guid idJerarquiaCarpeta,
                             IFabricaObjetosLinqJerarquiaDocumentos fabricaDocumento);

        /// <summary>
        /// Inserta estados a un proyecto especifico
        /// </summary>
        /// <param name="idProyecto">id del proyecto al que pertenece ese estado</param>
        /// <param name="nombreEstado">nombre del estado</param>
        void InsertarEstadoProyecto(Guid idProyecto, string nombreEstado);

        /// <summary>
        /// Inserta estados de documentos a un proyecto en especifico
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="nombreEstadoAprobado">Nombre del estado de aprobado</param>
        /// <param name="nombreEstadoRechazado">Nombre del estado de rechazado</param>
        void InsertarEstadoDocumentosProyecto(Guid idProyecto, string nombreEstadoAprobado, string nombreEstadoRechazado);

        /// <summary>
        /// Aplica los cambios en la base de datos
        /// </summary>
        void AplicarCambios();

		 /// <summary>
		  /// Inserta una carpeta. Si existe alguna carpeta con el mismo nombre no se
		  /// agrega nada
		  /// </summary>
		  /// <param name="nombreCarpeta">Nombre de la carpeta</param>
		  /// <returns>id de la carpeta creada, es null si el nombre de carpeta ya esta siendo usado</returns>
		  Guid? InsertarCarpeta(string nombreCarpeta);
		  

        /// <summary>
        /// Retorna el id de la carpeta otros segun un nombre de carpeta base y un id del candidato
        /// </summary>
        /// <param name="nombreCarpetaBase">nombre de la carpeta base</param>
        /// <param name="idCandidato">id del candidato</param>
        /// <returns>Id de la carpeta otros</returns>
        Guid GetIdCarpetaOtros(string nombreCarpetaBase, Guid idCandidato);

        /// <summary>
        /// Crea un reporte de documentos
        /// </summary>
        /// <param name="filename">nombre del archivo a crear</param>
        void CrearReporteDocumentos(string filename);

        /// <summary>
        /// Crea el reporte de costos
        /// </summary>
        /// <param name="filename">nombre del archivo a crear</param>
        void CrearReporteCostos(string filename);


		 /// <summary>
		 /// Metodo que asocia los estados predeterminados de ninguno y creado a un proyecto
		 /// </summary>
		 /// <param name="idProyecto"></param>
		  void InicializarAsociacionesEstadosPredeterminados(Guid idProyecto);
		 

        /// <summary>
        /// Carga un documento en el servidor
        /// </summary>
        /// <param name="nombreArchivo">Nombre del Documento</param>
        /// <param name="archivo">Arreglo de Bytes con la información del Documento</param>
        /// <param name="comentario">Comentarios del documento</param>
        /// <param name="idJerarquiaCarpeta">Identificador JerarquiaCarpeta</param>
        /// <param name="idCandidato">Id del candidato asociado al documento</param>
        void UploadDocumento(string nombreArchivo,
                                    System.Data.Linq.Binary archivo,
                                    string comentario,
                                    Guid idJerarquiaCarpeta,
                                    Guid idCandidato);

        /// <summary>
        /// Carga un documento en el servidor
        /// </summary>
        /// <param name="nombreArchivo">Nombre del Documento</param>
        /// <param name="archivo">Arreglo de Bytes con la información del Documento</param>
        /// <param name="comentario">Comentario del documento</param>
        /// <param name="idJerarquiaCarpeta">Identificador JerarquiaCarpeta</param>
        /// <param name="fabricaDocumento">Fabrica de EntidadesDocumento</param>
        /// <param name="idProyecto">id del proyecto asociado</param>
        /// <param name="idDocumentoTag">id del tag asociado</param>
        void UploadDocumento(string nombreArchivo,
                                              System.Data.Linq.Binary archivo,
                                              string comentario,
                                              Guid idJerarquiaCarpeta,
                                              IFabricaObjetosLinqJerarquiaDocumentos fabricaDocumento,
                                              Guid idProyecto,
                                              int idDocumentoTag);

        /// <summary>
        /// Carga un documento en el servidor
        /// </summary>
        /// <param name="nombreArchivo">Nombre del Documento</param>
        /// <param name="archivo">Arreglo de Bytes con la información del Documento</param>
        /// <param name="comentario">Comentarios del documento</param>
        /// <param name="idJerarquiaCarpeta">Identificador JerarquiaCarpeta</param>
        /// <param name="idCandidato">Id del candidato asociado al documento</param>
        /// <param name="idDocumentoTag">Id del tag del documento</param>
        /// <param name="idProyecto">Id del proyecto</param>
        void UploadDocumento(string nombreArchivo,
                                              System.Data.Linq.Binary archivo,
                                              string comentario,
                                              Guid idJerarquiaCarpeta,
                                              Guid idCandidato,
                                              int idDocumentoTag,
                                              Guid idProyecto);

        /// <summary>
        /// Aprueba un documento en el flujo de aprobación definido
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idDocumento">id de documento a aprobar</param>
        /// <param name="idEstado">id del estado actual del documento</param>
        void AprobarDocumento(string idProyecto, string idDocumento, string idEstado);

        /// <summary>
        /// Rechaza un documento en el flujo de aprobación definido
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idDocumento">id de documento a rechazar</param>
        /// <param name="idEstado">id del estado actual del documento</param>
        void RechazarDocumento(string idProyecto, string idDocumento, string idEstado);

        /// <summary>
        /// Método de actualizacion de una jerarquiaCarpeta
        /// </summary>
        /// <param name="jerarquiaCarpeta"></param>
        void ActualizarJerarquiaCarpeta(JerarquiaCarpeta jerarquiaCarpeta);

        /// <summary>
        /// Inserta una nueva carpeta como subcarpeta de la carpeta padre cuyo guid es dado. Si el padre
        /// no existe nada es insertado
        /// </summary>
        /// <param name="idCarpetaPadre">id carpeta padre</param>
        /// <param name="nombreCarpetaNueva">nombre de nueva carpeta</param>
        void InsertarCarpetaNueva(Guid idCarpetaPadre, string nombreCarpetaNueva);

        /// <summary>
        /// Sube de orden los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void SubirOrdenEstadosDocumentoProyecto(string idProyecto, string idEstadoAprobado, string idEstadoRechazado);

        /// <summary>
        /// Baja de orden los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void BajarOrdenEstadosDocumentoProyecto(string idProyecto, string idEstadoAprobado, string idEstadoRechazado);

		 /// <summary>
		 /// Calcula el porcentaje de documentos creados de un candidato en particular
		 /// </summary>
		  /// <param name="idCandidato">id del candidato</param>
		  float CalcularProcentajeCandidato(Guid idCandidato);
		 
		 /// <summary>
		 /// Retorna el Id de un estado por el nombre, si no lo encuentra retorna null
		 /// </summary>
		 /// <param name="nombreEstado">nombre del estado a buscar</param>
		 /// <returns></returns>
		  Guid? GetIdEstadoByNombre(string nombreEstado);
		  
	 }
}
